/*
Listas.java
Autor: Paola Garcia, carnet 10205
Fecha: 02 septiembre 2011
Descripcion: clase que extiende de la clase Abstracta, lo cual implementa 
las colas con listas circulares
*/


public class Listas<E> extends Abstracta<E>{
	
	//declaracion de variables
	protected Listas<E> tail;
	protected int count;
	protected E data;
	protected Listas<E> nextElement;
	protected int numc;
	
	//constructor
	public Listas(){
		tail = null;
		count = 0;
	}
	
	//constructor predeterminado
	public Listas<E> next(){
		return nextElement;
	}
	
	//generar lista de valores
	public Listas(E v){
		this();
	}
	
	//agregar el siguiente de la lista
	public void setNext(Listas<E> next){
		nextElement = next;
	}
	
	//el valor de la posicion de la cola
	public E value(){
		return data;
	}
	
	//agregar al principio al usuario
	public void addFirst(E value){
		Listas<E> temp = new Listas<E>(value);
		if (tail == null) { // first value added
			tail = temp;
			tail.setNext(tail);
		} 
		else { // element exists in list
			temp.setNext(tail.next());
			tail.setNext(temp);
		}
		count++;
	}
	
	//agregar al final al usuario
	public void addLast(E value){
		if (numc >= 10)
			System.out.println("Cola llena");
		else{
			numc ++;
			addFirst(value);
			tail = tail.next();
		}
	}
	
	//sacar a un usuario de la lista
	public E remove(){
		if(numc >= 0){
			numc --;
			Listas<E> finger = tail;
			Listas<E> temp = tail;
			if (finger == tail){
				tail = null;
			} 
			else {
				finger.setNext(tail.next());
				tail = finger;
			}
		}
	count--;
	return value();
	}

	//muestra el estado de la cola
	public String toString(){
		String datos = "";
		datos += "El numero de clientes en la cola es de: " + numc + ".";
		return datos;
	}
}
